package com.cskaoyan.javase.oop3._1interface._1basic;

/**
 * 自此，我们已经引入了接口的概念。
 * 接下来，我们重点来研究一个接口的特点和使用。
 * 接口的特点我们主要研究以下方面:
 *
 * 1.接口的声明特点
 *      思考:
 *      a.接口能不能创建对象?
 *          不能创建对象,实际上接口是抽象的
 *          因为接口的声明修饰符中隐含了关键字abstract
 *          既然是隐含的修饰符,那就不要写出来了
 *
 *      b.接口能不能用final修饰?
 *          不能,接口定义出来,目的就是为了被实现
 *          final天生和接口矛盾
 *
 * 2.接口的命名特点(非强制)
 *      接口在命名时,为了体现接口的特殊性
 *      表示它是一个接口
 *      某些程序员会在接口的命名前加大写字母"I"
 *
 * 3.接口的实现类的书写格式(非强制)
 *      某些程序员会在接口的所在位置
 *      定义一个全新的包,叫"impl"
 *      然后在该包下写接口的实现类,命名为"接口名 + Impl"
 *
 * 4.成员特点
 *      a.能不能定义属性?(成员变量,静态成员变量,全局常量)
 *      可以定义,但是接口中的属性默认都是
 *      "public static final"修饰修饰的公共的全局常量
 *      注意:
 *          1.这些隐含的修饰符不要写出来
 *          2.接口能够定义的所有结构的访问权限都是public
 *              而且public是隐含的修改不了
 *          3.接口中没有静态代码块,接口中的全局常量,必须显式赋值
 *          4.接口表示对功能的扩展,所以接口往往只有对行为的抽象(接口往往只有方法)
 *              接口是非常少见定义属性的
 *              只有当接口的所有实现类,都需要一个共同的全局常量时
 *              才考虑在接口中定义属性.
 *
 *      b.能不能定义方法/行为?
 *          可以定义方法
 *          但是接口中的方法默认都是"public abstracts"修饰的公共的抽象方法
 *          实际上,在Java8之前,接口中没有任何实现方法,接口中只能定义抽象方法
 *          在Java8以后,接口中提供了两种实现方法:
 *              1.静态方法
 *              2.默认方法
 *          特别强调:
 *              实际开发中,99%的情况下,接口就只有光秃秃的抽象方法定义
 *              没有其他任何内容
 *
 *
 *      c.构造器
 *          接口是没有构造器的,接口自己用不到构造器
 *          接口的子类也用不到
 *          所以接口不需要构造器
 *
 *      d.代码块
 *          没有静态代码块
 *          没有构造器就没有构造代码块
 *
 *      以上总结,接口能定义的结构特点:
 *          可以定义全局常量
 *          可以定义抽象方法(Java8以后允许实现方法)
 *          其它的啥也没有
 *          实际上,接口往往只有抽象方法定义,它表示对行为的抽象
 *          表示制定标准和规范
 *
 * 两个问题:
 *      1.实现接口的类，如果没有明确继承一个其他类，那么子类对象的隐式初始化super()指向Object类。
 *      如果明确继承了某个类
 *      那么super()就指向该直接父类的构造器
 *
 *      2.接口虽然不是类，但是它也继承了Object类。
 *          实际上继承不继承都无所谓
 *          因为接口自身没有对象
 *          接口的子类对象,肯定也继承Object类
 *
 * 接口的子类可以是什么？
 *
 * 普通类实现接口，必须实现所有的抽象方法。
 * 抽象类实现接口，按需实现抽象方法。
 *
 * @since 10:03
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 'A' is abstracts; cannot be instantiated
        // new A();

        System.out.println(IA.NUM);
        System.out.println(IAImpl.NUM);
        System.out.println(IAImpl2.NUM);

        IA ia;
    }
}

class IAImpl implements IA {
    @Override
    public void test() {

    }
}

class IAImpl2 implements IA {
    @Override
    public void test() {

    }
}

interface IA {
    // Variable 'num' might not have been initialized
    // Modifier 'final' is redundant for interface fields
    public static final int NUM = 100;
    // static { }

    // 定义方法
    public abstract void test();


}

// Modifier 'abstracts' is redundant for interfaces
// Modifier 'final' not allowed here
// abstracts final interface A{ }
